package net.begincode.common.template;

/**
 * Created by zhang7 on 2018/3/25.
 */
public interface RetryTemplate<T> {

    /**
     * 模板方法
     * @param  retryCount 重试次数
     * @param  intervalTime 重试间隔时间
     * @result Result
     */
     default T templateMethod(Integer retryCount, Long intervalTime){
        T result = null;
        for (int i = 0; i < retryCount; i++) {
            result = doBaseMethod();
            if(doForceResult(result)){
                break;
            }
            if(doCheckResult(result)){
                return result;
            }
            try {
                if(null != intervalTime){
                    Thread.sleep(intervalTime);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 基本方法
     * @result Result
     */
    T doBaseMethod();

    /**
     * 检查重试方法
     * @param  result 检查参数
     * @result boolean
     */
    Boolean doCheckResult(T result);

    /**
     * 中断重试
     * @param  result 检查参数
     * @result boolean
     */
    Boolean doForceResult(T result);
}
